package com.fwzhang.third.collectionframework.collection.set;

import java.util.Iterator;
import java.util.SortedSet;

/**
 * NavigableSet
 * SortedSet接口的增强接口
 * @param <E>
 */
public interface NavigableSetInterface<E> extends SortedSet<E> {

    /**
     * 以下四个方法
     * @throws ClassCastException 入参的指定节点无法比较（没有实现Comparable接口）
     * @throws NullPointerException 入参的指定节点为null
     */

    /**
     * 返回小于指定节点的最大的节点数据，如果不存在小于指定节点的节点，返回null
     * @param e
     * @return
     */
    E lower(E e);

    /**
     * 返回小于等于指定节点的最大的节点数据，如果不存在小于指定节点的节点，返回null
     * @param e
     * @return
     */
    E floor(E e);

    /**
     * 返回大于等于指定节点的最小的节点数据，如果不存在这样的节点，返回null
     * @param e
     * @return
     */
    E ceiling(E e);

    /**
     * 返回大于指定节点的最小的节点数据，如果不存在这样的节点，返回null
     * @param e
     * @return
     */
    E higher(E e);

    //

    /**
     * 返回并移除集合中第一个元素
     * @return 集合为空时，返回null
     */
    E pollFirst();

    /**
     * 返回并移除集合中最后一个元素
     * @return 集合为空时返回null
     */
    E pollLast();

    //

    /**
     * 返回当前集合的倒序集合
     * @return
     */
    NavigableSetInterface<E> descendingSet();

    Iterator<E> descendingIterator();

    // 获取子集合
    // 是父接口SortedSet中获取子集合的扩展，可以根据参数中的标志来选择结果是否包含起始或终止节点

    /**
     * 截取子集合，子集合修改也会影响源集合
     * @param fromElement 开始节点
     * @param fromInclusive 结果是否包括开始节点
     * @param toElement 结束节点
     * @param toInclusive 结果是否包括结束节点
     * @return
     */
    NavigableSetInterface<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive);

    NavigableSetInterface<E> headSet(E toElement, boolean toInclusive);

    NavigableSetInterface<E> tailSet(E fromElement, boolean fromInclusive);

    SortedSet<E> subSet(E fromElement, E toElement);
    SortedSet<E> headSet(E toElement);
    SortedSet<E> tailSet(E fromElement);

}
